#include <iostream>
using namespace std;
const int N = 10;
int n, res;
//col[i]=第i列是否放皇后,zdui[i]=主对角线是否放皇后,cdui[i]=次对角线是否放皇后
int col[N], zdui[2 * N], cdui[2 * N];
char map[N][N];

void dfs(int x)
{
    //搜到目标行，结束
    if (x == n)
    {
        res++;
        return;
    }
    for (int i = 0; i < n; i++)//逐列尝试
    {
        //同一主对角线上行减列相同，加n防止负数,次对角线上行加列相同
		//col[i]是一个标记数组，表示第i列是否已使用。
		//zdui[n + x - i]表示第i行减第i列是否已使用(主对角线）。
		//cdui[x + i]表示第i行加第i列是否已使用（次对角线）。
        if (!col[i] && !zdui[n + x - i] && !cdui[x + i])
        {
            col[i] = zdui[n + x - i] = cdui[x + i] = 1;
            dfs(x + 1);
            col[i] = zdui[n + x - i] = cdui[x + i] = 0;
        }
    }
}

int main()
{
    cin >> n;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            map[i][j] = '.';
    dfs(0);//第一行开搜
    cout << res;
    return 0;
}